//

import axios from "axios";
//这里我们下载了npm install --save nprogress这个插件使用，是一个进度条插件，并且需要引入它以及对应的css样式
import NProgress from "nprogress";
import 'nprogress/nprogress.css'

NProgress.configure({showSpinner:false});

// 配置所有的错误对象
const message = {
    401:'未授权',
    403:'禁止访问',
    404:'资源找不到',
    500:'服务器内部错误',
}

// 创建一个axios的实例
// 这个request功能和axios基本一致
const request = axios.create({
  // 这里把'/api'改为'/mock'
  baseURL: '/mock', // 基础路径：公共请求地址前缀
  headers: {},
  // xhr.abort() 中断请求
  timeout: 10000, // 请求的超时时间，请求超过10000ms没有返回响应，就会自动中断请求
});

/*
  设置拦截器

  发送请求工作流程：
    触发请求拦截器的回调
      设置公共的请求参数
    发送请求
    触发响应拦截器的回调
      处理响应结果
    触发then/catch的回调
*/

// 请求拦截器
request.interceptors.request.use(
  (config) => {
    // 成功的回调
    // console.log("111");

    NProgress.start();
    // config是请求的配置对象，将来发送请求的配置都是从config中读取的
    return config;
  }
  // () => {
  //   // 失败的回调，默认不会触发的
  //   console.log('222');
  // }
);
// 响应拦截器(两种状态，响应成功，响应失败)
request.interceptors.response.use(
  (response) => {
    // 响应成功/请求成功，2xx开头
    // console.log("333");
    NProgress.done();
    //   console.log('response.data.code');
    if (response.data.code === 200) {
      return response.data.data;
    } else {
      // message服务器可能返回一个空值，所以我们需要设置一个默认值
      return Promise.reject(response.data.message || "未知错误");
    }
  },
  (error) => {
    NProgress.done();
    // 响应失败/请求失败，非2开头
    //   console.log(e);
    let message = "未知错误，请联系管理员";
    console.dir(error);
    if (error.response) {
        // 这就使用了上面的错误配置对象，扩展性强，后续要添加直接在对象加上对应的状态码即可
      message = message[error.response.status];
    } else {
      if (error.message.indexOf('timeout') > -1) {
        message = "网络超时，请链接WIFI试试";
      } else if (error.message.indexOf('Network') > -1) {
        message='断网了。请打开网络链接试试'
      }
    }
    return Promise.reject(message)
  }
);

export default request;

